package visao.servicos;

import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;

import util.Criptografia;

import modelo.bean.Aluno;
import modelo.bean.Professor;
import modelo.bean.Usuario;
import controle.UsersAllControllers;

@Path("usuario")
public class ServicoUsuario {
	
	private Criptografia cript;

	private UsersAllControllers usuarioControle;

	public ServicoUsuario() {
		usuarioControle = new UsersAllControllers(new Usuario());
		cript = Criptografia.getInstance();
	}

	@GET
	@Produces({ MediaType.APPLICATION_JSON, MediaType.TEXT_XML })
	@Path("/findAluno/{id:[0-9]*}")
	public Aluno recuperarAluno(@PathParam("id") Long id) {
		try {
			Aluno aluno = (Aluno) usuarioControle.find(id);
			usuarioControle.setAluno(aluno);
			return aluno;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;

	}
	
	@GET
	@Produces({ MediaType.APPLICATION_JSON, MediaType.TEXT_XML })
	@Path("/findProfessor/{id:[0-9]*}")
	public Professor recuperarProfessor(@PathParam("id") Long id) {
		try {
			Professor professor = (Professor) usuarioControle.find(id);
			usuarioControle.setProfessor(professor);
			return professor;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;

	}

	@GET
	@Produces(MediaType.APPLICATION_JSON)
	@Path("/auth")
	public Object autentica(@HeaderParam("matricula") String matriculaC,
			@HeaderParam("senha") String senhaC, @Context HttpServletResponse resposta) {
		try {
			
//			String login = cript.descritografa(loginC.getBytes());
//			String senha = cript.descritografa(senhaC.getBytes());
			
			//return usuarioControle.find(2l);
			Object o = usuarioControle.autenticar(matriculaC, senhaC);
			if (o instanceof Aluno) {
				resposta.setHeader("tipo", "Aluno");
			} else if (o instanceof Professor) {
				resposta.setHeader("tipo", "Professor");
			} else if (o instanceof Usuario) {
				resposta.setHeader("tipo", "Usuario");
			}
			
			return o;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}

	}

	@POST
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	public String salvar(Usuario u) {
		try {
			usuarioControle.setUsuario(u);
			usuarioControle.criarUsuario();
		} catch (Exception e) {
			System.out.println("Erro ao salvar Usuário: " + e.getMessage());
			e.printStackTrace();
			return "Erro ao salvar";
		}
		return "Sucesso ao salvar";
	}
	
	@POST
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	@Path("/salvarProfessor")
	public String salvarProf(Professor p) {
		try {
			usuarioControle.setProfessor(p);
			usuarioControle.criarProfessor();
		} catch (Exception e) {
			System.out.println("Erro ao salvar Professor: " + e.getMessage());
			return "Erro ao salvar";
		}
		return "Sucesso ao salvar";
	}
	
	@POST
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	@Path("/salvarAluno")
	public String salvarAluno(Aluno a) {
		try {
			usuarioControle.setAluno(a);
			usuarioControle.criarAluno();
		} catch (Exception e) {
			System.out.println("Erro ao salvar Aluno: " + e.getMessage());
			return "Erro ao salvar";
		}
		return "Sucesso ao salvar";
	}
	
	@DELETE
	@Produces(MediaType.APPLICATION_JSON)
	@Path("{id:[0-9]*}")
	public String deleta(@PathParam("id") Long id) {
		try {
			usuarioControle.excluir(id);
		} catch (Exception e) {
			System.err.println(e.getMessage());
			e.printStackTrace();
			return "Erro ao Deletar Usuario";
		}
		return "Deletado";
	}
	
	@PUT
	@Produces(MediaType.APPLICATION_JSON)
	@Consumes(MediaType.APPLICATION_JSON)
	@Path("/editarAluno")
	public String editarAluno(Aluno a) {
		try {
			usuarioControle.alterarAluno(a);
		} catch (Exception e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
		return "Editado";
	}
	@PUT
	@Produces(MediaType.APPLICATION_JSON)
	@Consumes(MediaType.APPLICATION_JSON)
	@Path("/editarProfessor")
	public String editarProfessor(Professor p) {
		try {
			usuarioControle.alterarProfessor(p);
		} catch (Exception e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
		return "Editado";
	}

}
